home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / WarpQuake / Src / surf16.s < prev    next >
Text File  |  2000-05-22  |  3KB  |  173 lines

  1. /*
  2. Copyright (C) 1996-1997 Id Software, Inc.
  3.  
  4. This program is free software; you can redistribute it and/or
  5. modify it under the terms of the GNU General Public License
  6. as published by the Free Software Foundation; either version 2
  7. of the License, or (at your option) any later version.
  8.  
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  12.  
  13. See the GNU General Public License for more details.
  14.  
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  18.  
  19. */
  20. //
  21. // surf16.s
  22. // x86 assembly-language 16 bpp surface block drawing code.
  23. //
  24.  
  25. #include "asm_i386.h"
  26. #include "quakeasm.h"
  27. #include "asm_draw.h"
  28.  
  29. #if id386
  30.  
  31. //----------------------------------------------------------------------
  32. // Surface block drawer
  33. //----------------------------------------------------------------------
  34.  
  35.     .data
  36.  
  37. k:            .long    0
  38. loopentry:    .long    0
  39.  
  40.     .align    4
  41. blockjumptable16:
  42.     .long    LEnter2_16
  43.     .long    LEnter4_16
  44.     .long    0, LEnter8_16
  45.     .long    0, 0, 0, LEnter16_16
  46.  
  47.  
  48.     .text
  49.  
  50.     .align 4
  51. .globl C(R_Surf16Start)
  52. C(R_Surf16Start):
  53.  
  54.     .align 4
  55. .globl C(R_DrawSurfaceBlock16)
  56. C(R_DrawSurfaceBlock16):
  57.     pushl    %ebp                // preserve caller's stack frame
  58.     pushl    %edi
  59.     pushl    %esi                // preserve register variables
  60.     pushl    %ebx
  61.  
  62.     movl    C(blocksize),%eax
  63.     movl    C(prowdestbase),%edi
  64.     movl    C(pbasesource),%esi
  65.     movl    C(sourcesstep),%ebx
  66.     movl    blockjumptable16-4(,%eax,2),%ecx
  67.     movl    %eax,k
  68.     movl    %ecx,loopentry
  69.     movl    C(lightleft),%edx
  70.     movl    C(lightright),%ebp
  71.  
  72. Lblockloop16:
  73.  
  74.     subl    %edx,%ebp
  75.     movb    C(blockdivshift),%cl
  76.     sarl    %cl,%ebp
  77.     jns        Lp1_16
  78.     testl    C(blockdivmask),%ebp
  79.     jz        Lp1_16
  80.     incl    %ebp
  81. Lp1_16:
  82.  
  83.     subl    %eax,%eax
  84.     subl    %ecx,%ecx    // high words must be 0 in loop for addressing
  85.  
  86.     jmp        *loopentry
  87.  
  88.     .align    4
  89.  
  90. #include "block16.h"
  91.  
  92.     movl    C(pbasesource),%esi
  93.     movl    C(lightleft),%edx
  94.     movl    C(lightright),%ebp
  95.     movl    C(sourcetstep),%eax
  96.     movl    C(lightrightstep),%ecx
  97.     movl    C(prowdestbase),%edi
  98.  
  99.     addl    %eax,%esi
  100.     addl    %ecx,%ebp
  101.  
  102.     movl    C(lightleftstep),%eax
  103.     movl    C(surfrowbytes),%ecx
  104.  
  105.     addl    %eax,%edx
  106.     addl    %ecx,%edi
  107.  
  108.     movl    %esi,C(pbasesource)
  109.     movl    %ebp,C(lightright)
  110.     movl    k,%eax
  111.     movl    %edx,C(lightleft)
  112.     decl    %eax
  113.     movl    %edi,C(prowdestbase)
  114.     movl    %eax,k
  115.     jnz        Lblockloop16
  116.  
  117.     popl    %ebx                // restore register variables
  118.     popl    %esi
  119.     popl    %edi
  120.     popl    %ebp                // restore the caller's stack frame
  121.     ret
  122.  
  123. .globl C(R_Surf16End)
  124. C(R_Surf16End):
  125.  
  126. //----------------------------------------------------------------------
  127. // Code patching routines
  128. //----------------------------------------------------------------------
  129.     .data
  130.  
  131.     .align 4
  132. LPatchTable16:
  133.     .long    LBPatch0-4
  134.     .long    LBPatch1-4
  135.     .long    LBPatch2-4
  136.     .long    LBPatch3-4
  137.     .long    LBPatch4-4
  138.     .long    LBPatch5-4
  139.     .long    LBPatch6-4
  140.     .long    LBPatch7-4
  141.     .long    LBPatch8-4
  142.     .long    LBPatch9-4
  143.     .long    LBPatch10-4
  144.     .long    LBPatch11-4
  145.     .long    LBPatch12-4
  146.     .long    LBPatch13-4
  147.     .long    LBPatch14-4
  148.     .long    LBPatch15-4
  149.  
  150.     .text
  151.  
  152.     .align 4
  153. .globl C(R_Surf16Patch)
  154. C(R_Surf16Patch):
  155.     pushl    %ebx
  156.  
  157.     movl    C(colormap),%eax
  158.     movl    $LPatchTable16,%ebx
  159.     movl    $16,%ecx
  160. LPatchLoop16:
  161.     movl    (%ebx),%edx
  162.     addl    $4,%ebx
  163.     movl    %eax,(%edx)
  164.     decl    %ecx
  165.     jnz        LPatchLoop16
  166.  
  167.     popl    %ebx
  168.  
  169.     ret
  170.  
  171.  
  172. #endif    // id386
  173.